package testes;

import static org.junit.Assert.*;

import iscte.es.copaPaises.businessLayer.CalendarDate;
import iscte.es.copaPaises.businessLayer.Campeonato;
import iscte.es.copaPaises.businessLayer.Cartao;
import iscte.es.copaPaises.businessLayer.Clube;
import iscte.es.copaPaises.businessLayer.Equipa;
import iscte.es.copaPaises.businessLayer.Golo;
import iscte.es.copaPaises.businessLayer.Grupo;
import iscte.es.copaPaises.businessLayer.Jogador;
import iscte.es.copaPaises.businessLayer.Jogo;
import iscte.es.copaPaises.businessLayer.Membro;
import iscte.es.copaPaises.businessLayer.Pais;
import iscte.es.copaPaises.businessLayer.Participacao;
import iscte.es.copaPaises.businessLayer.PosicaoJogador;
import iscte.es.copaPaises.businessLayer.TipoCartao;

import java.util.HashSet;
import java.util.Set;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class EquipaTest {
	private Equipa e;
	private Jogo jogo;
	private Pais seleccao;
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Before
	public void setUp() throws Exception {
		e=new Equipa();
		jogo=new Jogo();
		seleccao=new Pais();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testEquipa() {
		assertTrue("Equipa()",Equipa.allInstances.contains(e));
	}

	@Test
	public void testEquipaJogoPais() {
		e=new Equipa(jogo, seleccao);
		assertTrue("Equipa(jogo, seleccao)",Equipa.allInstances.contains(e));
	}

	@Test
	public void testJogo() {
		e.setJogo(jogo);
		assertEquals("Setter/Getter Equipa.jogo()",jogo ,e.jogo());
	}

	@Test
	public void testSeleccao() {
		e.setSeleccao(seleccao);
		assertEquals("Setter/Getter Equipa.seleccao()",seleccao ,e.seleccao());
	}

	@Test
	public void testMembro() {
		Membro m1=new Membro();
		Membro m2=new Membro();
		Membro m3=new Membro();
		Set<Membro> membros=new HashSet<Membro>();
		membros.add(m1);membros.add(m2);
		e.setMembro(membros);
		assertEquals("Setter/Getter Equipa.membro()",e.membro(),membros);	
	}

	@Test
	public void testJogador() {
		Jogador j1=new Jogador();
		Jogador j2=new Jogador();

		Membro m1=new Membro();
		Membro m2=new Membro();
		Membro m3=new Membro();
		Set<Jogador> jogadores=new HashSet<Jogador>();
		Set<Membro> membros=new HashSet<Membro>();

		membros.add(m1);membros.add(m2);
		e.setMembro(membros);

		jogadores.add(j1);jogadores.add(j2);
		e.setJogador(jogadores);

		assertEquals("Setter/Getter Equipa.jogador()",e.jogador(),jogadores);
	}

	@Test
	public void testCriaFichaJogoFalsa() {
		Campeonato campeonato=new Campeonato();
		Grupo grupo=new Grupo();
		grupo.setCampeonato(campeonato);
		jogo.setGrupo(grupo);
		e=new Equipa(jogo, seleccao);

		//Creates Set<Participacao>
		Participacao participacao1=new Participacao();
		Participacao participacao2=new Participacao();
		participacao1.setParticipado(campeonato);
		Set<Participacao> participacoes=new HashSet<Participacao>();
		participacoes.add(participacao1);participacoes.add(participacao2);
		seleccao.setParticipacao(participacoes);

		//Creates Plantel
		//leapYear 2012;
		//not leapYear 2013
		Set<Jogador> jogadores=new HashSet<Jogador>();
		Jogador j1=new Jogador( new CalendarDate(1,1,2013),  "Caneira",new Pais(),  PosicaoJogador.Defesa, new  Clube());
		Jogador j2=new Jogador( new CalendarDate(16,8,2012),  "Caneira",new Pais(),  PosicaoJogador.Defesa, new  Clube());
		Jogador j3=new Jogador( new CalendarDate(14,3,2012),  "Caneira",new Pais(),  PosicaoJogador.Defesa, new  Clube());
		Jogador j4=new Jogador( new CalendarDate(16,9,2012),  "Caneira",new Pais(),  PosicaoJogador.Defesa, new  Clube());
		Jogador j5=new Jogador( new CalendarDate(16,3,2012),  "Caneira",new Pais(),  PosicaoJogador.Defesa, new  Clube());
		Jogador j6=new Jogador( new CalendarDate(14,8,2012),  "Caneira",new Pais(),  PosicaoJogador.Defesa, new  Clube());
		Jogador j7=new Jogador( new CalendarDate(14,8,2012),  "Caneira",new Pais(),  PosicaoJogador.Avancado, new  Clube());
		Jogador j8=new Jogador( new CalendarDate(14,8,2013),  "Caneira",new Pais(),  PosicaoJogador.Avancado, new  Clube());
		jogadores.add(j1);
		jogadores.add(j2);
		jogadores.add(j3);
		jogadores.add(j4);
		jogadores.add(j5);
		jogadores.add(j6);
		jogadores.add(j7);
		jogadores.add(j8);
		participacao1.setPlantel(jogadores);

		Golo.allInstances.clear();
		Cartao.allInstances.clear();
		e.criaFichaJogoFalsa();

		assertEquals(Golo.allInstances.size(),2);
		for(Golo g:Golo.allInstances){
			if(g.minuto()==8*7){
				assertEquals("Equipa.criaFichaJogoFalsa()",g.marcador().jogador(),j7);
			}
			if(g.minuto()==14){
				assertEquals("Equipa.criaFichaJogoFalsa()",g.marcador().jogador(),j8);
			}
		}
		
		assertEquals(Cartao.allInstances.size(),4);
		for(Cartao c:Cartao.allInstances){
			if(c.minuto()==14+3){
				assertEquals("Equipa.criaFichaJogoFalsa()",c.tipo(),TipoCartao.Amarelo);
				assertEquals("Equipa.criaFichaJogoFalsa()",c.membro().jogador(),j3);
			}
			if(c.minuto()==16+9){
				assertEquals("Equipa.criaFichaJogoFalsa()",c.tipo(),TipoCartao.Amarelo);
				assertEquals("Equipa.criaFichaJogoFalsa()",c.membro().jogador(),j4);
			}
			if(c.minuto()==16+3){
				assertEquals("Equipa.criaFichaJogoFalsa()",c.tipo(),TipoCartao.Amarelo);
				assertEquals("Equipa.criaFichaJogoFalsa()",c.membro().jogador(),j5);
			}
			if(c.minuto()==16*2+3){
				assertEquals("Equipa.criaFichaJogoFalsa()",c.tipo(),TipoCartao.Vermelho);
				assertEquals("Equipa.criaFichaJogoFalsa()",c.membro().jogador(),j5);
			}
		}
	}

	@Test
	public void testToString() {
		e=new Equipa(jogo, seleccao);
		assertEquals("Equipa.toString()",e.toString(),"Equipa [jogo=" + jogo + ", seleccao=" + seleccao + "]\n");
	}

}
